package com.ahora.org.controller.MBean;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import com.ahora.org.ejb.facade.interfaces.ReporteFacade;
import com.ahora.org.ejb.jpa.beans.AgregarFechasDTO;
import com.ahora.org.ejb.jpa.beans.AreaReporteDTO;
import com.ahora.org.ejb.jpa.beans.TiempoDeRespuesta;
import com.ahora.org.ejb.jpa.entities.Expediente;
import com.ahora.org.ejb.jpa.entities.MovimientoExpediente;
import com.ahora.org.ejb.jpa.entities.Proceso;
import com.ahora.org.ejb.jpa.entities.Requisitos;
import com.ahora.org.ejb.jpa.entities.TipoDocumentosInternos;
import com.ahora.org.ejb.jpa.entities.Usuario;
import com.ahora.org.ejb.jpa.entities.Utilitarios;

@ManagedBean(name = "reporteBM")
@SessionScoped
public class ReporteBM {

	@EJB
	private ReporteFacade objReporteFacade;

	private List<Usuario> lstUsuariosReporting;
	private List<TipoDocumentosInternos> lstTipoDocumentosInternos;
	private List<Requisitos> lstRequisitos;
	private List<AgregarFechasDTO> lstAgregarFechas;
	private List<Utilitarios> lstUtilitarios;
	private List<AreaReporteDTO> lstUnidadOrganica;
	private List<MovimientoExpediente> lstMovimientoExpediente;
	private List<TiempoDeRespuesta> lstTiempoRespuesta;
	private List<Proceso> lstProcedimientosArea;
	private List<Expediente> lstExpedientes;
	
	//cantidad de la lista
	private int cantLista;

	public ReporteBM() {
		System.out.println("INICIALIZANDO EL BEAN MANAGER REPORTE BM");
	}

	private Usuario ObtenerUsuarioSession() {
		Usuario objUsuario = null;
		ExternalContext context = FacesContext.getCurrentInstance()
				.getExternalContext();
		HttpSession sessionhttp = (HttpSession) context.getSession(true);
		if (sessionhttp.getAttribute("usuarioLogin") == null) {
			objUsuario = new Usuario();
		} else {
			objUsuario = (Usuario) sessionhttp.getAttribute("usuarioLogin");
		}
		return objUsuario;
	}

	/******************************* ACTION LISTENER DE LA BANDEJA DEL ADMINISTRADOR *******************************************/
	public void listarUsuarios(ActionEvent f) {
		lstUsuariosReporting = new ArrayList<Usuario>();
		System.out.println("ESTOY EN MI ACTION LISTENER");
		try {
			lstUsuariosReporting= objReporteFacade.listarUsuariosAll();
			cantLista=lstUsuariosReporting.size(); 
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptUsuariosRegistrados");
	}

	public void listarTipoDocumentosInternos(ActionEvent f) {
		lstTipoDocumentosInternos = new ArrayList<TipoDocumentosInternos>();
		try {
			lstTipoDocumentosInternos = objReporteFacade.listarTipoDocumentoIdentidad();
			cantLista= lstTipoDocumentosInternos.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptTipoDocumentos");
	}

	public void listaFechas(ActionEvent f) {
		lstAgregarFechas = new ArrayList<AgregarFechasDTO>();
		try {
			lstAgregarFechas= objReporteFacade.listarFechasAll();
			cantLista=lstAgregarFechas.size(); 
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptFechasReservadas");
	}

	public void listarParametrosConsignados(ActionEvent f) {
		lstUtilitarios = new ArrayList<Utilitarios>();
		try {
			lstUtilitarios = objReporteFacade.listarUtilitariosAll();
			cantLista= lstUtilitarios.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptParametrosConsignados");
	}

	public void listarRequisitosAll(ActionEvent f) {
		lstRequisitos = new ArrayList<Requisitos>();
		try {
			lstRequisitos= objReporteFacade.listarRequisitosAll();
			cantLista= lstRequisitos.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptRequisitosRegistrados");
	}

	public void listarUnidadOrganicaGrupoTrabajo(ActionEvent f) {
		lstUnidadOrganica = new ArrayList<AreaReporteDTO>();
		try {
			lstUnidadOrganica = objReporteFacade.listarAreasAll();
			cantLista=lstUnidadOrganica.size(); 
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptUnidadOrganicaGrupoTrabajo");
	}

	/******************************************************************************************************************/
	/*********************************** ACTION LISTENER DEL SUPERVISOR *************************************************/
	/******************************************************************************************************************/
	public void listarPendientesArea_Super(ActionEvent p) {
		lstMovimientoExpediente = new ArrayList<MovimientoExpediente>();
		try {
			lstMovimientoExpediente = objReporteFacade.listarPendientesAtender(ObtenerUsuarioSession());
			cantLista= lstMovimientoExpediente.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptS_PendientesArea");
	}

	public void listarCargaDeTrabajo(ActionEvent a) {
		lstMovimientoExpediente = new ArrayList<MovimientoExpediente>();
		try {
			lstMovimientoExpediente = objReporteFacade.listarCargaTrabajo(ObtenerUsuarioSession());
			cantLista= lstMovimientoExpediente.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptS_CargaTrabajo");
	}

	public void listarTiempoDeRespuesta(ActionEvent p) {
		lstTiempoRespuesta = new ArrayList<TiempoDeRespuesta>();
		try {
			lstTiempoRespuesta = objReporteFacade.listarTiempoRespuestaTecnicos(ObtenerUsuarioSession());
			cantLista=lstTiempoRespuesta.size(); 
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptS_TiempoRespuestaUsuario");
	}

	public void listarExpedientesAmiCargo(ActionEvent p) {
		lstExpedientes = new ArrayList<Expediente>();
		try {
			lstExpedientes = objReporteFacade.listarExpedientesAmiCargo(ObtenerUsuarioSession());
			cantLista= lstExpedientes.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptS_ExpedientexServicio");
	}

	public void listarProcedimientosArea(ActionEvent p) {
		lstProcedimientosArea = new ArrayList<Proceso>();
		try {
			lstProcedimientosArea = objReporteFacade.listarProcedimientosArea(ObtenerUsuarioSession());
			cantLista= lstProcedimientosArea.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptS_ServiciosAsignados");
	}

	public void listarExpedientesRecepcionados(ActionEvent p) {
		lstMovimientoExpediente = new ArrayList<MovimientoExpediente>();
		try {
			lstMovimientoExpediente = objReporteFacade.listarExpedientesRecepcionados(ObtenerUsuarioSession());
			cantLista= lstMovimientoExpediente.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptS_ExpedientesRecepcionados");
	}

	public void listarExpedientesEnviados(ActionEvent p) {
		lstMovimientoExpediente = new ArrayList<MovimientoExpediente>();
		try {
			lstMovimientoExpediente = objReporteFacade.listarExpedientesEnviados(ObtenerUsuarioSession());
			cantLista= lstMovimientoExpediente.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().getNavigationHandler()
				.handleNavigation(fc, null, "rptS_ExpedientesEnviados");
	}

	/******************* SERVLETS - REPORTES DEL ADMINISTRADOR ******************************************/
	private final String reportingUsuariosRegistrados = "/ReportingUsuariosRegistrados";
	private final String reportingTipoDocumentos = "/ReportingTiposDocumentos";
	private final String reportingFechasReservadas = "/ReportingFechasReservadas";
	private final String reportingParametrosConsignados = "/ReportingParametrosConsignados";
	private final String reportingRequisitosRegistrados = "/ReportingRequisitosRegistrados";
	private final String reportingUnidadOrganicaGrupoTrabajo = "/ReportingUnidadOrganicaGrupoTrabajo";

	private void generateReporting(String rutaServlet) {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			context.getExternalContext().dispatch(rutaServlet);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			context.responseComplete();
		}
	}

	public void ReportingUsuariosRegistrados() {
		generateReporting(reportingUsuariosRegistrados);
	}

	public void ReportingTipoDocumentos() {
		generateReporting(reportingTipoDocumentos);
	}

	public void ReportingFechasReservadas() {
		generateReporting(reportingFechasReservadas);
	}

	public void ReportingParametrosConsignados() {
		generateReporting(reportingParametrosConsignados);
	}

	public void ReportingRequisitosRegistrados() {
		generateReporting(reportingRequisitosRegistrados);
	}

	public void ReportingUnidadOrganicaGrupoTrabajo() {
		generateReporting(reportingUnidadOrganicaGrupoTrabajo);
	}

	/******************* SERVLET - REPORTES DEL TECNICO *************************************************/
	private final String reportingTecnicoExpedientesEnviados="/ReportingTecnicoExpedientesEnviados";
	private final String reportingTecnicoExpedientesRecepcionados="/ReportingTecnicoExpedientesRecepcionados";
	
	/******************* SERVLET - REPORTES DEL SUPERVISOR *********************************************/
	private final String reportingSupervisorPendientesArea = "/ReportingSuperPendientesArea";
	private final String reportingSupervisorCargaDeTrabajo = "/ReportingSuperCargaTrabajo";
	private final String reportingSupervisorTiempoRespuesta = "/ReportingSuperTiempoRespuesta";
	private final String reportingSupervisorProcedimientosArea = "/ReportingSuperProcedimientosArea";
	private final String reportingSupervisorExpedientesAmiCargo = "/ReportingSuperExpedientesAmiCargo";
	private final String reportingSupervisorExpedientesRecepcionados = "/ReportingSuperExpedientesRecepcionados";
	private final String reportingSupervisorExpedientesEnviados = "/ReportingSuperExpedientesEnviados";

	public void SupervisorReporte_PendientesArea() {
		if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==3) {
			generateReporting(reportingSupervisorPendientesArea);
		}else if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==4) {
			generateReporting(reportingSupervisorGeneralPendientesArea);
		}
		
	}

	public void SupervisorReporte_CargaDeTrabajo() {
		
		if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==3) {
			generateReporting(reportingSupervisorCargaDeTrabajo);
		}else if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==4) {
			generateReporting(reportingSupervisorGeneralCargaDeTrabajo);
		}
	}

	public void SupervisorReporte_TiempoRespuesta() {
		
		if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==3) {
			generateReporting(reportingSupervisorTiempoRespuesta);
		}else if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==4) {
			generateReporting(reportingSupervisorGeneralTiempoRespuesta);
		}
	}

	public void SupervisorReporte_ProcedimientosArea() {
		
		if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==3) {
			generateReporting(reportingSupervisorProcedimientosArea);
		}else if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==4) {
			generateReporting(reportingSupervisorGeneralProcedimientosArea);
		}
	}

	public void SupervisorReporte_ExpedientesAmiCargo() {
		
		if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==3) {
			generateReporting(reportingSupervisorExpedientesAmiCargo);
		}else if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==4) {
			generateReporting(reportingSupervisorGeneralExpedientesAmiCargo);
		}
	}

	public void SupervisorReporte_ExpedientesRecepcionados() {
		if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==2) {
			generateReporting(reportingTecnicoExpedientesRecepcionados);
		}else if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==3) {
			generateReporting(reportingSupervisorExpedientesRecepcionados);
		}else if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==4) {
			generateReporting(reportingSupervisorGeneralExpedientesRecepcionados);
		}
	}

	public void SupervisorReporte_ExpedientesEnviados() {
		if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==2) {
			generateReporting(reportingTecnicoExpedientesEnviados);
		}else if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==3) {
			generateReporting(reportingSupervisorExpedientesEnviados);
		}else if (ObtenerUsuarioSession().getTbRolUsuario().getIdRolUsuario()==4) {
			generateReporting(reportingSupervisorGeneralExpedientesEnviados);
		}
	}

	/******************* SERVLET - REPORTES DEL SUPERVISOR GENERAL **************************************/
	private final String reportingSupervisorGeneralPendientesArea = "/ReportingSGeneralPendientesArea";
	private final String reportingSupervisorGeneralCargaDeTrabajo = "/ReportingSGeneralCargaTrabajo";
	private final String reportingSupervisorGeneralTiempoRespuesta = "/ReportingSGeneralTiempoRespuesta";
	private final String reportingSupervisorGeneralProcedimientosArea = "/ReportingSGeneralProcedimientosArea";
	private final String reportingSupervisorGeneralExpedientesAmiCargo = "/ReportingSGeneralExpedientesAmiCargo";
	private final String reportingSupervisorGeneralExpedientesRecepcionados = "/ReportingSGeneralExpedientesRecepcionados";
	private final String reportingSupervisorGeneralExpedientesEnviados = "/ReportingSGeneralExpedientesEnviados";

	/******************************* GETTER AND SETTER **************************************************/
	public List<TipoDocumentosInternos> getLstTipoDocumentosInternos() {
		return lstTipoDocumentosInternos;
	}

	public void setLstTipoDocumentosInternos(
			List<TipoDocumentosInternos> lstTipoDocumentosInternos) {
		this.lstTipoDocumentosInternos = lstTipoDocumentosInternos;
	}

	public List<Usuario> getLstUsuariosReporting() {
		return lstUsuariosReporting;
	}

	public void setLstUsuariosReporting(List<Usuario> lstUsuariosReporting) {
		this.lstUsuariosReporting = lstUsuariosReporting;
	}

	public List<Requisitos> getLstRequisitos() {
		return lstRequisitos;
	}

	public void setLstRequisitos(List<Requisitos> lstRequisitos) {
		this.lstRequisitos = lstRequisitos;
	}

	public List<AgregarFechasDTO> getLstAgregarFechas() {
		return lstAgregarFechas;
	}

	public void setLstAgregarFechas(List<AgregarFechasDTO> lstAgregarFechas) {
		this.lstAgregarFechas = lstAgregarFechas;
	}

	public List<Utilitarios> getLstUtilitarios() {
		return lstUtilitarios;
	}

	public void setLstUtilitarios(List<Utilitarios> lstUtilitarios) {
		this.lstUtilitarios = lstUtilitarios;
	}

	public List<AreaReporteDTO> getLstUnidadOrganica() {
		return lstUnidadOrganica;
	}

	public void setLstUnidadOrganica(List<AreaReporteDTO> lstUnidadOrganica) {
		this.lstUnidadOrganica = lstUnidadOrganica;
	}

	public List<MovimientoExpediente> getLstMovimientoExpediente() {
		return lstMovimientoExpediente;
	}

	public void setLstMovimientoExpediente(
			List<MovimientoExpediente> lstMovimientoExpediente) {
		this.lstMovimientoExpediente = lstMovimientoExpediente;
	}

	public List<TiempoDeRespuesta> getLstTiempoRespuesta() {
		return lstTiempoRespuesta;
	}

	public void setLstTiempoRespuesta(List<TiempoDeRespuesta> lstTiempoRespuesta) {
		this.lstTiempoRespuesta = lstTiempoRespuesta;
	}

	public List<Proceso> getLstProcedimientosArea() {
		return lstProcedimientosArea;
	}

	public void setLstProcedimientosArea(List<Proceso> lstProcedimientosArea) {
		this.lstProcedimientosArea = lstProcedimientosArea;
	}

	public List<Expediente> getLstExpedientes() {
		return lstExpedientes;
	}

	public void setLstExpedientes(List<Expediente> lstExpedientes) {
		this.lstExpedientes = lstExpedientes;
	}

	public int getCantLista() {
		return cantLista;
	}

	public void setCantLista(int cantLista) {
		this.cantLista = cantLista;
	}

}
